﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Reflection;
using System.Resources;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using www.Core.Contract.DataContract;
using Image = System.Web.UI.WebControls.Image;

namespace www.Controllers
{
    public class Utilities
    {
        public static string Gender(int sex)
        {
            return sex == 1 ? "Nam" : "Nữ";
        }

        public static string Active(int active)
        {
            return active == 1 ? "Hiển thị" : "Ẩn";
        }

        public static string Isanswer(int isanswer)
        {
            return isanswer == 1 ? "tr. lời" : "chưa tr. lời";
        }
        public static string TooltipActive( int iActive)
        {
            if (iActive == Constant.Active.Display)
                return "Ẩn";
            return "Hiển thị";
        }
        public static void DeleteFile(string path)
        {
            var fileinfo = new FileInfo(path);
            if (File.Exists(path))
                fileinfo.Delete();
        }
        
        public static class Langguage
        {

            public static string SelectLanguageName(List<RelaxLanguageDataContract> lLanguage, int iLanguageCode)
            {
                var language = lLanguage.FirstOrDefault(l => l.Id == iLanguageCode);
                if (language != null)
                    return language.Name;
                return null;
            }
        }

        public static class Dropdownlists
        {

            public static void Addlist(HtmlSelect select, string[] arr, object culture)
            {
                @select.Items.Clear();
                @select.Items.Add(new ListItem("--Chọn--", "0"));
                char[] kt = { ',', '.', ';' };
                //ArrayList a = new ArrayList();
                for (var i = 0; i < arr.Length; ++i)
                {
                    var tmp = arr[i].Split(kt);
                    // a.AddRange(tmp);
                    var item = new ListItem(tmp[1], tmp[0]);
                    @select.Items.Add(item);
                }
            }
            public static void Addlist(DropDownList select, string[] arr, object culture)
            {
                @select.Items.Clear();
                @select.Items.Add(new ListItem("--Chọn--", "0"));
                char[] kt = { ',', '.', ';' };
                //ArrayList a = new ArrayList();
                for (var i = 0; i < arr.Length; ++i)
                {
                    var tmp = arr[i].Split(kt);
                    // a.AddRange(tmp);
                    var item = new ListItem(tmp[1], tmp[0]);
                    @select.Items.Add(item);
                }
            }
        }

        private string GetCultureLanguage()
        {
            var languages = HttpContext.Current.Request.UserLanguages;
            if (languages == null || languages.Length == 0)
                return null;
            var language = languages[0].ToLowerInvariant().Trim();
            var ci = CultureInfo.CreateSpecificCulture(language);
            return ci.Name;
        }

        public int GetLanguageCode()
        {
            var cul = GetCultureLanguage();
            if (cul == "vi-VN")
                return 1;
            if (cul == "zh-CN" || cul == "zh-TW")
                return 3;
            return 2;
        }
    }
    public  class Utility
    {
        public static class GetResource
        {
            public static string GetResouceValue(object culture=null, string colName=null)
            {
                try
                {
                    culture = culture ?? "vi-VN";
                    var filename = Constant.ResourceFile.Resource + culture.ToString().Trim();

                    var rm = new ResourceManager(filename, Assembly.GetExecutingAssembly());
                    var resource = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true);
                    var name = resource.GetString(colName);
                    return name;
                }
                catch (Exception)
                {
                    
                }
                return null;
            }

            public static string GetResouceMessage(object culture, string colName)
            {
                try
                {
                    culture = culture ?? "vi-VN";
                    var resourcename = Constant.ResourceFile.Message + culture.ToString().Trim();

                    var rm = new ResourceManager(resourcename, Assembly.GetExecutingAssembly());
                    var resource = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true);
                    var name = resource.GetString(colName);
                    return name;
                }
                catch (Exception)
                {
                    
                }
                return null;
            }
            //public static void SetTextControl(List<HtmlGenericControl> lControls, List<HtmlInputButton> lControlsbuton, object culture)
            //{
            //    foreach (var item in lControls)
            //    {
            //        item.InnerText= GetResouceValue(culture, Convert.ToString(item));
            //    }
            //    if (lControlsbuton!=null)
            //    {
            //        foreach (var buton in lControlsbuton)
            //        {
            //            buton.Value = GetResouceValue(culture, buton.ToString());
            //        }
            //    }
            //}
        }
        public static string Gender(int sex)
        {
            return sex == 1 ? "Nam" : "Nữ";
        }

        public static string Active(int active)
        {
            return active == 1 ? "Hoạt động" : "Không hoạt động";
        }

        public static string Isanswer(int isanswer)
        {
            return isanswer == 1 ? "tr. lời" : "chưa tr. lời";
        }

        //public static Image ResizeByWidth(Image img, int width)
        //{
        //    // lấy chiều rộng và chiều cao ban đầu của ảnh
        //    var originalW = img.Width;
        //    var originalH = img.Height;

        //    // lấy chiều rộng và chiều cao mới tương ứng với chiều rộng truyền vào của ảnh (nó sẽ giúp ảnh của chúng ta sau khi resize vần giứ được độ cân đối của tấm ảnh
        //    var resizedW = width;
        //    var resizedH = (Convert.ToInt32(originalH) * Convert.ToInt32(resizedW)) / Convert.ToInt32(originalW);

        //    // tạo một Bitmap có kích thước tương ứng với chiều rộng và chiều cao mới
        //    var bmp = new Bitmap(resizedW, resizedH);

        //    // tạo mới một đối tượng từ Bitmap
        //    Graphics graphic = Graphics.FromImage((Image)bmp);
        //    graphic.InterpolationMode = InterpolationMode.High;

        //    // vẽ lại ảnh với kích thước mới
        //    graphic.DrawImage(img, 0, 0, Convert.ToInt32(resizedW), Convert.ToInt32(resizedH));

        //    // gải phóng resource cho đối tượng graphic
        //    graphic.Dispose();

        //    // trả về anh sau khi đã resize
        //    return (Image)bmp;
        //}
        public  void DeleteFile(string path)
        {
            var fileinfo = new FileInfo(path);
            if(File.Exists(path))
                fileinfo.Delete();
        }

        public Boolean SendMail(string mailfrom, string password, string mailto, string content, string subject)
        {
            var regex = new System.Text.RegularExpressions.Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");

            var result = regex.IsMatch(mailto);
            if (result == false)
            {
                return false;
            }
            var message = new MailMessage {From = new MailAddress(mailfrom)};

            //message.From = mailfrom;
            message.To.Add(new MailAddress(mailto));
            message.Subject = subject;
            message.IsBodyHtml = true;
            message.Body = content;
            message.Priority = MailPriority.High;
            try
            {
                var send = new SmtpClient
                {
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    EnableSsl = true,
                    Host = "smtp.gmail.com",
                    Port = 587
                };
                var credential = new NetworkCredential(mailfrom, password);
                send.UseDefaultCredentials = false;
                send.Credentials = credential;
                send.Send(message);
                return true ;
            }
            catch
            {
                return false;
            }
        }

        public string Nomalized(string str)
        {
            str= str.TrimStart(' ').TrimEnd(' ');
            char[] kt = { ',', '.', '\'', ';', ':', '?', '/', '<', '>', '"', '{', '}', '|', '\\', '+', '=', '-', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '`', '~' };
            foreach (var t in kt.Where(t => str.Contains(t)))
            {
                str = str.Replace(t.ToString(), "");
            }
            return str;
        }

        public Boolean IsValidImage(string path)
        {
            var extend = path.Substring(path.LastIndexOf('.') + 1);
            return extend == "jpg" || extend == "JPG" || extend == "JPEG" || extend == "jpeg" || extend == "png" || extend == "PNG";
        }

        public bool IsValidEmail(string email)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(email, @"^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$");
        }

        public bool IsValidUrl(string url)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(url, @"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$");
        }
       
        #region Encript and Decript
        /// <summary>
        /// Mã hóa ký tự với kiểu mã hõa TripleDes - MD5 
        /// </summary>
        /// <param name="key"></param>
        /// <param name="toEncrypt"></param>
        /// <returns></returns>
        public  string Encrypt(string key, string toEncrypt)
        {
            var toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
            var hashmd5 = new MD5CryptoServiceProvider();
            var keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(key));
            var tdes = new TripleDESCryptoServiceProvider
            {
                Key = keyArray,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
            var cTransform = tdes.CreateEncryptor();
            var resultArray = cTransform.TransformFinalBlock(
                  toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
        /// <summary>
        /// Giải mã dữ liệu đã mã hóa 
        /// </summary>
        /// <param name="key"></param>
        /// <param name="toDecrypt"></param>
        /// <returns></returns>
        public  string Decrypt(string key, string toDecrypt)
        {
            var toEncryptArray = Convert.FromBase64String(toDecrypt);
            var hashmd5 = new MD5CryptoServiceProvider();
            var keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes(key));
            var tdes = new TripleDESCryptoServiceProvider
            {
                Key = keyArray,
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
            var cTransform = tdes.CreateDecryptor();
            var resultArray = cTransform.TransformFinalBlock(
             toEncryptArray, 0, toEncryptArray.Length);
            return Encoding.UTF8.GetString(resultArray);
        }

        #endregion

        public static string ConvertToUnSign(string text)
        {
            for (int i = 33; i < 48; i++)
            {
                text = text.Replace(((char)i).ToString(), "");
            }
            for (int i = 58; i < 65; i++)
            {
                text = text.Replace(((char)i).ToString(), "");
            }
            for (int i = 91; i < 97; i++)
            {
                text = text.Replace(((char)i).ToString(), "");
            }
            for (int i = 123; i < 127; i++)
            {
                text = text.Replace(((char)i).ToString(), "");
            }
            //text = text.Replace(" ", "-"); //Comment lại để không đưa khoảng trắng thành ký tự -



            Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");
            var strFormD = text.Normalize(NormalizationForm.FormD);

            return regex.Replace(strFormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');

        }
    }

    //public class SServices
    //{
    //    private ServiceClient _serviceClient;

    //    public SServices()
    //    {
    //        _serviceClient = new ServiceClient();
    //        if (_serviceClient.ClientCredentials != null)
    //        {
    //            _serviceClient.ClientCredentials.UserName.UserName = "Dragon_hy.14021990";
    //            _serviceClient.ClientCredentials.UserName.Password = "DraGon_Hy_09910241";
    //        }
    //    }
    //}
    public class Constant
    {
        public static class Active
        {
            public const int Display = 1;
            public const int Hiden = 0;
            public const string HienThi = "Hiển Thị";
            public const string An = "Ẩn";
        }
        public static class Default
        {
            public const int Macdinh = 1;
            public const int Khongmacdinh = 0;

        }

        public static class Sex
        {
            public const int Nam = 1;
            public const int Nu = 0;
        }
        public class ResourceFile
        {
            public const string Resource = "www.Resource.";
            public const string Message = "www.Resource.Message-";
        }
    }
}